'use strict';

const axios = require('axios');

/**
 * 代理请求云函数
 * 用于转发第三方API请求，避免跨域问题
 */
exports.main = async (event, context) => {
  console.log('代理请求云函数被调用，参数：', event);
  
  try {
    // 处理不同的调用方式
    let requestParams;
    
    // 如果是HTTP触发器调用，参数在body中
    if (event.body) {
      try {
        requestParams = typeof event.body === 'string' ? JSON.parse(event.body) : event.body;
      } catch (e) {
        requestParams = event.body;
      }
    } else {
      // 如果是uniCloud.callFunction调用，参数直接在event中
      requestParams = event;
    }
    
    console.log('解析后的请求参数：', requestParams);
    
    // 从requestParams中获取请求参数
    const {
      url,           // 目标URL
      method = 'GET', // 请求方法，默认GET
      headers = {},   // 请求头
      data = null,    // 请求体数据
      params = {},    // URL参数
      timeout = 30000 // 超时时间，默认30秒
    } = requestParams;

    // 验证必要参数
    if (!url) {
      return {
        success: false,
        error: 'URL参数不能为空',
        code: 400
      };
    }

    // 验证URL格式
    try {
      new URL(url);
    } catch (e) {
      return {
        success: false,
        error: 'URL格式不正确',
        code: 400
      };
    }

    // 设置默认请求头
    const defaultHeaders = {
      'User-Agent': 'UniApp-CloudFunction-Proxy/1.0',
      'Accept': 'application/json, text/plain, */*',
      ...headers
    };

    // 构建axios请求配置
    const axiosConfig = {
      url,
      method: method.toUpperCase(),
      headers: defaultHeaders,
      timeout,
      // 允许所有状态码，由调用方处理
      validateStatus: () => true
    };

    // 根据请求方法添加数据
    if (['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {
      axiosConfig.data = data;
    }

    // 添加URL参数
    if (Object.keys(params).length > 0) {
      axiosConfig.params = params;
    }

    console.log('发起请求，配置：', {
      url: axiosConfig.url,
      method: axiosConfig.method,
      headers: axiosConfig.headers,
      hasData: !!axiosConfig.data,
      params: axiosConfig.params
    });

    // 发起请求
    const response = await axios(axiosConfig);

    console.log('请求完成，状态码：', response.status);

    // 返回响应结果
    return {
      success: true,
      data: response.data,
      status: response.status,
      statusText: response.statusText,
      headers: response.headers,
      // 添加一些元信息
      meta: {
        requestUrl: url,
        requestMethod: method,
        timestamp: new Date().toISOString()
      }
    };

  } catch (error) {
    console.error('代理请求发生错误：', error);

    // 处理axios错误
    if (error.response) {
      // 服务器响应了错误状态码
      return {
        success: false,
        error: '目标服务器返回错误',
        data: error.response.data,
        status: error.response.status,
        statusText: error.response.statusText,
        headers: error.response.headers
      };
    } else if (error.request) {
      // 请求已发出但没有收到响应
      return {
        success: false,
        error: '请求超时或网络错误',
        code: 'NETWORK_ERROR',
        message: error.message
      };
    } else {
      // 其他错误
      return {
        success: false,
        error: '请求配置错误',
        code: 'CONFIG_ERROR',
        message: error.message
      };
    }
  }
};